#include "stm32f10x.h"
#include "main_config.h"
#include "motor.h"
#include "stdlib.h"
#include "delay.h"
#include "usart.h"


extern GPIO_TypeDef* GPIO_COT[MOTOR_NUM];
extern uint16_t GPIO_Pin_COT[MOTOR_NUM];


extern struct TargetNode* target_list;

extern u8 inBackToZero;
extern u8 inDecode;
extern u8 inSendData;
extern u8 toZeroFlagX;
extern u8 toZeroFlagY;

void EXTI15_10_IRQHandler(void){
	if(EXTI_GetITStatus(EXTI_Line10)!=RESET){
		//delay_ms(10);
		//printf("X1:%d\r\n",GPIO_ReadInputDataBit(GPIO_ZERO_X1,GPIO_Pin_ZERO_X1));
		if(GPIO_ReadInputDataBit(GPIO_ZERO_X1,GPIO_Pin_ZERO_X1)==0&&toZeroFlagX==0){
			toZeroFlagX=1;
			runStop();
		}
	}
	if(EXTI_GetITStatus(EXTI_Line11)!=RESET){
		//delay_ms(10);
		//printf("X2:%d\r\n",GPIO_ReadInputDataBit(GPIO_ZERO_X2,GPIO_Pin_ZERO_X2));
		if(GPIO_ReadInputDataBit(GPIO_ZERO_X2,GPIO_Pin_ZERO_X2)==0&&toZeroFlagX==0){
			toZeroFlagX=1;
			runStop();
		}
	}
	EXTI_ClearITPendingBit(EXTI_Line10);
	EXTI_ClearITPendingBit(EXTI_Line11);
}

void EXTI9_5_IRQHandler(void){
	if(EXTI_GetITStatus(EXTI_Line6)!=RESET){
		//delay_ms(10);
		//printf("Y1:%d\r\n",GPIO_ReadInputDataBit(GPIO_ZERO_Y1,GPIO_Pin_ZERO_Y1));
		if(GPIO_ReadInputDataBit(GPIO_ZERO_Y1,GPIO_Pin_ZERO_Y1)==0&&toZeroFlagY==0){
			toZeroFlagY=1;
			runStop();
		}
	}
	if(EXTI_GetITStatus(EXTI_Line7)!=RESET){
		//delay_ms(10);
		//printf("Y2:%d\r\n",GPIO_ReadInputDataBit(GPIO_ZERO_Y2,GPIO_Pin_ZERO_Y2));
		if(GPIO_ReadInputDataBit(GPIO_ZERO_Y2,GPIO_Pin_ZERO_Y2)==0&&toZeroFlagY==0){
			toZeroFlagY=1;
			runStop();
		}
	}
	EXTI_ClearITPendingBit(EXTI_Line6);
	EXTI_ClearITPendingBit(EXTI_Line7);
}


void TIM_COT_IRQHandler(void){
	if(TIM_GetITStatus(TIM_COT,TIM_IT_CC1)!=RESET){
		if(target_list->destin!=NULL&&inDecode==0){
			lineInterpolation();
		}
		
		TIM_ClearITPendingBit(TIM_COT,TIM_IT_CC1);
	}
	if(TIM_GetITStatus(TIM_COT,TIM_IT_Update)!=RESET){
		GPIO_WriteBit(GPIO_COT[0],GPIO_Pin_COT[0],(BitAction)0);
		GPIO_WriteBit(GPIO_COT[1],GPIO_Pin_COT[1],(BitAction)0);
		// updataStep();
		TIM_ClearITPendingBit(TIM_COT,TIM_IT_Update);
	}
}


void USART_COM_IRQHandler(void){
	if(USART_GetFlagStatus(USART_COM,USART_FLAG_RXNE)){
		u8 data=USART_ReceiveData(USART_COM);
		//USART_SendData(USART_COM,data);
		
		USART_ClearITPendingBit(USART_COM,USART_IT_COM);
	}
}

void USART_TEST_IRQHandler(void){
	if(USART_GetFlagStatus(USART_TEST,USART_FLAG_RXNE)){
		u8 data=USART_ReceiveData(USART_TEST);
		//USART_SendData(USART_TEST,data);
		
		getData(data);
		
		USART_ClearITPendingBit(USART_COM,USART_IT_TEST);
	}
}
